/**
 * 
 */
package org.stars.dao.sqlmapper.parser;

import org.stars.dao.sqlmapper.SqlBase;
import org.stars.dao.sqlmapper.SqlMapper;
import org.stars.daostars.exceptions.parser.MalformedCommentException;


/**
 * Search and remove comment in the sql.
 * 
 * Cerca e rimuove tutti i commenti presenti nel sql.
 * I commenti che iniziano con /*+ vengono lasciati, dato che
 * in oracle sono consierati come direttive.
 * 
 * @author Francesco Benincasa
 * 
 */
public abstract class SubParser01_CommentRemover {

	/**
	 * Process every query in the sqlMapper. It works on the attribute <code>templateText</code>.
	 * 
	 * Processa ogni query nel sqlMapper. Lavora sull'attributo <code>templateText</code>.
	 * 
	 */
	public static void execute(SqlMapper sqlMapper) throws MalformedCommentException {
		for (SqlBase item : sqlMapper.getMap().values()) {
			execute(item);
		}
	}
	

	/**
	 * Remove comments, execpt comments that starts with /*+. In oracle
	 * this kind of comments are directive. If the comment are malformed,
	 * an <code>MalformedCommentException</code> will be launched
	 * 
	 *
	 * Dato una stringa <code>sql</code>, rimuove tutte i codici di commento,
	 * tranne quelli che iniziano con /*+ che rappresentano in oracle delle
	 * direttive al parser delle query. Se i commenti sono malformati,
	 * viene sollevata un'eccezione di tipo <code>MalformedCommentException</code>.
	 * 
	 * @param
	 * 			query
	 * @return 
	 * 			sql template without comments
	 * @throws MalformedCommentException
	 *          exception
	 */
	public static void execute(SqlBase query) throws MalformedCommentException {
		String sqlMapperName=query.getSqlMapper().getId();
		String sql=query.getTemplateText();
		StringBuffer sb = new StringBuffer();
		boolean bEsegui = true;

		int startIndex = 0;
		int endIndex = 0;
		int beginCopy = 0;
		int lastIndex = 0;

		while (bEsegui) {
			startIndex = sql.indexOf("/*", endIndex);
			endIndex = sql.indexOf("*/", endIndex + 1);

			// Controlla la presenza di commenti speciali
			if (startIndex > -1 && endIndex > -1) {

				String seqCar = sql.substring(startIndex + 2, startIndex + 3);

				if ("+".equalsIgnoreCase(seqCar)) {
					continue;
				} else {
					sb.append(sql.substring(beginCopy, startIndex));
					beginCopy = endIndex + 2;
					lastIndex = beginCopy;
				}

			} else
				bEsegui = false;
		}

		if (startIndex != -1 || endIndex != -1) {
			String daoName=sqlMapperName;
			String queryName=query.getId();
			String msg = "SqlMapper " + daoName + ", query " + queryName
					+ ": Comment are malformed!";
			throw (new MalformedCommentException(msg));
		}

		if (lastIndex < sql.length() - 1) {
			sb.append(sql.substring(lastIndex));
		}

		query.setTemplateText(sb.toString());
	}

}
